#ifndef _CURTAIN_H_
#define _CURTAIN_H_
#include "air32f10x_conf.h"

/*
发送命令时:
    最低位代表发射头的1号
    最低位代表接收头的16号

接收到回传时:
    最低位代表发射头的16号
    最低位代表接收头的1号

开机时
    1, 所有传感器都在线  :          跳过在线状态显示

    2, 只有一部分在线    :          一直停留在在线状态显示,用于调试
    3, 所有传感器都不在线:          但在两个嘟声和提示中只接入了部分传感器,

    4, 所有传感器都不在线:          但在两个嘟声和提示中接入了所有传感器,进入屏蔽部分光线程序

*/
// 外部变量
extern uint16_t tmp_scan_list[10];
extern uint16_t has_tmp_scan_list;
extern uint16_t is_old_curtain;

// 存储扫描光线列表的地址
#define HAS_TEMP_SCANLIST 0xAB                  // 有临时扫描列表
#define NO_TEMP_SCANLIST 0xCD                   // 无临时扫描列表
#define TEMP_SCANLIST_FLAG (USER_AREA_BASE + 0) // 是否有临时扫描列表的标志的存储地址
#define TEMP_SCANLIST_ADDR (USER_AREA_BASE + 1) // 扫描列表的存储地址

// 存储扫描光线列表的地址
#define HAS_TEMP_SCANLIST 0xAB                  // 有临时扫描列表
#define NO_TEMP_SCANLIST 0xCD                   // 无临时扫描列表
#define TEMP_SCANLIST_FLAG (USER_AREA_BASE + 0) // 是否有临时扫描列表的标志的存储地址
#define TEMP_SCANLIST_ADDR (USER_AREA_BASE + 1) // 扫描列表的存储地址

// 转换数据格式的宏
#define TXMSG(x) ((uint16_t)0x0001 << (x - 1))                           // 要扫描01号发射头, 可以发送TXMSG(01), TXMSG(01) == RXMSG(16)
#define RXMSG(x) ((uint16_t)0x8000 >> (x - 1))                           // 要扫描16号接收头, 可以发送RXMSG(16), TXMSG(01) == RXMSG(16)
#define RESULT_2_CMD(ScanResult) ((uint16_t)(__RBIT(~ScanResult) >> 16)) // 将扫描结果转换为发送命令
#define CMD_2_RESULT(Cmd) ((uint16_t)(__RBIT(Cmd) >> 16))                // 将命令转换为全阻断的结果

#define CURTAIN_R_SCAN_US 1700
#define CURTAIN_ONLINE_REPLAY_US 200

uint16_t curtain_read_light_status(uint8_t id, uint16_t led_mask);
uint16_t curtain_blocked_light_count(uint8_t id, uint16_t led_mask);
uint8_t curtain_is_send_online(uint8_t id);
uint8_t curtain_is_recv_online(uint8_t id);
uint8_t curtain_online_count(uint8_t max_id);
uint8_t curtains_temp_read_scanlist(uint8_t max_id);
#endif